/**
 * Copyright (c) 2024,  科泰集团教研团队
 * 版权所有，请勿侵权
 */
package com.ktjiaoyu.ktmall.dao;


import com.ktjiaoyu.ktmall.utils.DatabaseUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.function.Function;

/**
 * @author 科泰集团教研团队
 * @version 1.0.0
 * @packageName com.ktjiaoyu.news.dao
 * @fileName BaseDao.java
 * @createTime 2024/11/29 15:51
 * @lastModify 2024/11/29 15:51
 */
public class BaseDao {
    /**
     * 适合执行一次性操作的构造函数
     */
    public BaseDao() {
    }

    /**
     * 适合事务处理的构造函数
     *
     * @param connection
     */
    public BaseDao(Connection connection) {
        this.connection = connection;
    }

    /**
     * 允许外部传入Connection，便于支持事务
     */
    protected Connection connection;

    /**
     * 获取连接
     * @return
     */
    public Connection getConnection() {
        if (connection != null) {
            // 说明外部传递了connection，直接返回
            return connection;
        }
        try {
            // 如果外部未传入连接，则使用一次性的连接
            return DatabaseUtil.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通用更新方法
     * @param sql    增删改数据
     * @param params 占位符参数
     * @return 受影响行数
     */
    protected int executeUpdate(String sql, Object... params) throws SQLException{
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            // 创建连接对象
            conn = getConnection();
            // 获取执行sql对象
            stmt = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                // 设置参数
                stmt.setObject(i + 1, params[i]);
            }
            // 执行sql获得结果
            return stmt.executeUpdate();
        } finally {
            if (this.connection == null) {
                // 一次性连接，关闭
                DatabaseUtil.closeAll(conn, stmt, null);
            } else {
                // 外部传递连接，暂时不关闭
                DatabaseUtil.closeAll(null, stmt, null);
            }
        }
    }

    /**
     * 通用查询方法
     * @param sql 查询的sql语句
     * @param resultSetHandler 结果集处理器（将ResultSet提供给外部封装结果）
     * @param params 占位符参数
     * @return
     */
    protected <T> T executeQuery(String sql, Function<ResultSet, T> resultSetHandler,
                                 Object... params) throws SQLException{
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = this.getConnection();
            stmt = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                stmt.setObject(i + 1, params[i]);
            }
            rs = stmt.executeQuery();
            // 将结果集提供给函数型接口，通知调用方解析并获得结果
            return resultSetHandler.apply(rs);
        } finally {
            if (this.connection == null) {
                // 一次性连接，关闭
                DatabaseUtil.closeAll(conn, stmt, rs);
            } else {
                // 外部传递连接，暂时不关闭
                DatabaseUtil.closeAll(null, stmt, rs);
            }
        }
    }
}

